package com.hy.ssm.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 图片水印工具类
 */
public class WaterMarkUtil {
    private static final String FONT_NAME = "宋体";
    private static final int FONT_STYLE = Font.BOLD;    // 粗体
    private static final int FONT_SIZE = 20;    // 字体大小
    private static final Color FONT_COLOR = Color.RED;  // 字体颜色
    private static final String MARK_TEXT = "胡杨大大大"; // 水印文字
    private static final String MARK_PIC = "images/code.jpg"; // 水印图片的相对路径

    /**
     * 给指定的图片右下角加上水印文字
     * 等用户将图片上传到服务器之后再加水印
     *
     * @param pic
     */
    public static void textWaterMark(File pic) {
        FileOutputStream fos = null;
        try {
            // 1、获取要添加水印的图片
            Image image = ImageIO.read(pic);

            // 2、获取图片的大小
            int width = image.getWidth(null);
            int height = image.getHeight(null);

            // 3、创建图片缓冲对象
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            // 4、获取图片的绘制工具
            Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();

            // 5、绘制原图片
            graphics2D.drawImage(image, 0, 0, width, height, null);

            // 6、再绘制水印
            // (1) 设置水印文本字体、样式
            graphics2D.setFont(new Font(FONT_NAME, FONT_STYLE, FONT_SIZE));

            // (2) 设置字体颜色
            graphics2D.setColor(FONT_COLOR);

            // (3) 计算文本大小，以便定位
            int x = width - getTextWidth(MARK_TEXT) * FONT_SIZE - 20;
            int y = height - FONT_SIZE;     // 这个水印文本距顶部的距离为：图片高度 - 字体大小

            // (4) 设置透明度
            graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5F));

            // (5) 设置文本的位置
            graphics2D.drawString(MARK_TEXT, x, y);

            // 7、释放工具
            graphics2D.dispose();

            fos = new FileOutputStream(pic.getAbsoluteFile());
            // 8、将图片缓冲区中的数据写入到文件中
            ImageIO.write(bufferedImage, "JPEG", fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 给指定的图片右下角加上水印图片
     * 等用户将图片上传到服务器之后再加水印
     * @param pic
     */
    public static void picWaterMark(File pic) {
        FileOutputStream fos = null;
        try {
            // 1、获取要添加水印的图片
            Image image = ImageIO.read(pic);

            // 2、获取图片的大小
            int width = image.getWidth(null);
            int height = image.getHeight(null);

            // 3、创建图片缓冲对象
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            // 4、获取图片的绘制工具
            Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();

            // 5、绘制原图片
            graphics2D.drawImage(image, 0, 0, width, height, null);

            // 6、再绘制水印
            // 获取水印图片
            Image waterMarkPic = ImageIO.read(new File(ConstantInfo.basepath, MARK_PIC));

            // (1) 设置水印文本字体、样式
            graphics2D.setFont(new Font(FONT_NAME, FONT_STYLE, FONT_SIZE));

            // (2) 设置字体颜色
            graphics2D.setColor(FONT_COLOR);

            // (3) 计算图片大小，以便定位
            int x = width - waterMarkPic.getWidth(null);
            int y = height - waterMarkPic.getHeight(null);

            // (4) 设置透明度
            graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.8F));

            // (5) 设置文本的位置
            graphics2D.drawImage(waterMarkPic, x, y, null);
            // 7、释放工具
            graphics2D.dispose();

            fos = new FileOutputStream(pic.getAbsoluteFile());
            // 8、将图片缓冲区中的数据写入到文件中
            ImageIO.write(bufferedImage, "JPEG", fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 获取文本的宽度（宽度与字符有关，一个英文一个字节，一个中文两个字节或者三个字节，宽度不一样，因此需要计算）
     *
     * @return
     */
    private static int getTextWidth(String text) {
        int length = text.length(); // 获取水印字符串长度
        String temp = null;
        // 循环获取每一个字符
        for (int i = 0, len = text.length(); i < len; ++i) {
            temp = String.valueOf(text.charAt(i));  // 获取当前循环得到的字符
            if (temp.getBytes().length > 1) { // 说明不是一个字符
                ++length;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }
}
